#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,inf=1e9;
int n,k,rt,A,B,dfn[N],dcnt,fa[N],out[N],dep[N],v[N],f[N],g[N],h[N],u[N],q[N],s[N];
vector<int>E[N],e[N],t[N],c[N*2];
struct SEG{
	int a[262144];
	void bt(){
		memset(a,0x3f,sizeof(a));
	}
	void add(int x,int l,int r,int v,int L,int R){
		if(l>r) return;
		if(l==L&&r==R) return a[x]=min(a[x],v),void();
		int mid=L+R>>1;
		if(r<=mid) add(x<<1,l,r,v,L,mid);
		else if(l>mid) add(x<<1|1,l,r,v,mid+1,R);
		else add(x<<1,l,mid,v,L,mid),add(x<<1|1,mid+1,r,v,mid+1,R);
	}
	int que(int x,int p,int L,int R){
		if(L==R) return a[x];
		int mid=L+R>>1;
		if(p<=mid) return min(a[x],que(x<<1,p,L,mid));
		return min(a[x],que(x<<1|1,p,mid+1,R));
	}
}T;
void dfs1(int x,int f){
	dfn[x]=++dcnt,v[dep[x]=dep[fa[x]=f]+1]=x,c[dep[x]].push_back(x);
	if(dep[x]>A) t[v[dep[x]-A]].push_back(x);
	for(int i:E[x]) if(i!=f) dfs1(i,x),e[x].push_back(i);
	out[x]=dcnt;
}
bool chk(int K){
	k=K;
	T.bt();
	for(int i=1;i<=n;i++) u[i]=i<=k?dep[i]:inf,f[i]=1,h[i]=inf;
	for(int d=n;d>=1;d--){
		for(int x:c[d+A-B]){
			if(f[x]) h[x]=dep[x];
			else for(int i:e[x]) h[x]=min(h[x],h[i]);
			T.add(1,dfn[fa[x]]+1,dfn[x]-1,h[x]-(d+A-B-1)*2,1,n);
			T.add(1,out[x]+1,out[fa[x]],h[x]-(d+A-B-1)*2,1,n); 
			int L=e[x].size(),w=0,p=0,o=0;
			for(int i=0;i<L;i++) q[i]=s[i]=1;
			for(int i=0,j=0;i<L;i++){
				while(j<t[x].size()&&dfn[t[x][j]]<=out[e[x][i]]) q[i]&=g[t[x][j++]],s[i]=0;
				if(s[i]) q[i]=u[e[x][i]]<=d+A,p+=q[i];
				else w+=q[i],o++;
			}
			for(int i=0,_=0;i<L;i++,_=0){
				if(s[i]&&w==o) _|=o||p-q[i]||x<=K;
				if(!s[i]&&w==o+q[i]-1) _|=o-1||p||x<=K;
				if(_) T.add(1,dfn[e[x][i]],out[e[x][i]],-inf,1,n);
			}
		}
		for(int x:c[d]){
			for(int i:e[x]) u[x]=min(u[x],u[i]);
			if(t[x].size()){
				for(int i:t[x]){
					if(min(h[i]-dep[i],dep[i]+T.que(1,dfn[i],1,n))<=B) g[i]=1;
					else f[x]=0,g[i]=0;
				}
			}
			else f[x]=u[x]<=d+B;
		}
	}
	return f[rt];
}
int main(){
	freopen("nim.in","r",stdin);
	freopen("nim.out","w",stdout);
	cin>>n>>rt>>A>>B;
	if(A<=B) return puts("1"),0;
	for(int i=1,j,k;i<n;i++){
		scanf("%d %d",&j,&k);
		E[j].push_back(k);
		E[k].push_back(j);
	}
	dfs1(rt,0);
	int l=1,r=n;
	while(l<r){
		int mid=l+r>>1;
		if(chk(mid)) r=mid;
		else l=mid+1;
	}
	cout<<l;
	return 0;
} 
